/**
 * @brief 读取WAV文件并转换为单声道归一化数据
 * @param filename 文件名
 * @param sample_rate [out] 返回采样率
 * @param num_samples [out] 返回总采样点数
 * @return std::vector<double> 归一化到[-1, 1]的单声道数据
 */
std::vector<double> read_wav(const char* filename, 
                            uint32_t& sample_rate, 
                            uint32_t& num_samples) {
    // 打开文件并读取头信息
    std::ifstream file(filename, std::ios::binary);
    if (!file) throw std::runtime_error("无法打开文件");

    WavHeader header;
    file.read(reinterpret_cast<char*>(&header), sizeof(header));

    // 验证基础格式合法性
    if (memcmp(header.riff, "RIFF", 4) != 0 ||   // 必须包含RIFF标识
        memcmp(header.wave, "WAVE", 4) != 0 ||   // 必须包含WAVE标识
        memcmp(header.fmt, "fmt ", 4) != 0) {    // 必须包含"fmt "块
        throw std::runtime_error("无效的WAV文件");
    }

    // 仅支持8/16位PCM格式
    if (header.bits_per_sample != 8 && 
        header.bits_per_sample != 16) {
        throw std::runtime_error("仅支持8位和16位的PCM格式");
    }

    sample_rate = header.sample_rate;  // 设置输出参数采样率

    // 计算总采样点数（根据位深度调整）
    if (header.bits_per_sample == 8) {
        // 8位数据：每样本1字节，总点数 = 数据大小 / 声道数
        num_samples = header.data_size / header.channels;
    } else if (header.bits_per_sample == 16) {
        // 16位数据：每样本2字节，总点数 = 数据大小 / (声道数*2)
        num_samples = header.data_size / (header.channels * 2);
    }

    // 创建单声道数据容器
    std::vector<double> mono(num_samples);

    // 处理8位无符号PCM数据
    if (header.bits_per_sample == 8) {
        std::vector<uint8_t> raw_data(header.data_size);
        file.read(reinterpret_cast<char*>(raw_data.data()), header.data_size);

        // 转换为单声道：多声道数据取平均值
        for (size_t i = 0; i < num_samples; ++i) {
            double sum = 0;
            // 遍历所有声道
            for (int c = 0; c < header.channels; ++c) {
                // 8位无符号转有符号：0~255 -> -128~127，再归一化到[-1,1]
                sum += (static_cast<int>(raw_data[i * header.channels + c]) - 128) / 128.0;
            }
            mono[i] = sum / header.channels;  // 多声道取平均
        }
    } 
    // 处理16位有符号PCM数据
    else if (header.bits_per_sample == 16) {
        std::vector<int16_t> raw_data(num_samples * header.channels);
        file.read(reinterpret_cast<char*>(raw_data.data()), header.data_size);
        // 转换为单声道：多声道数据取平均值
        for (size_t i = 0; i < num_samples; ++i) {
            double sum = 0;
            for (int c = 0; c < header.channels; ++c) {
                // 16位有符号直接归一化：-32768~32767 -> -1.0~1.0
                sum += raw_data[i * header.channels + c] / 32768.0;
            }
            mono[i] = sum / header.channels;  // 多声道取平均
        }
    }

    return mono;
}
